package com.example.chartapp;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.*;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;

import java.util.HashMap;
import java.util.Map;

/**
 * @PACKAGE_NAME: com.example.chartapp
 * @CLASS_NAME: ChatWebSocketHandler
 * @USER: BTS&ARMY
 * @Date 2024/10/9 11:18
 * @Version 1.0
 */

@Component
public class ChatWebSocketHandler extends TextWebSocketHandler {


    private MessageRepository messageRepository;  // 注入 MessageRepository

    // 构造方法注入，自动注入 MessageRepository
    @Autowired
    public ChatWebSocketHandler(MessageRepository messageRepository) {
        this.messageRepository = messageRepository;
        if (messageRepository == null) {
            System.out.println("MessageRepository is null!");  // 打印调试信息
        } else {
            System.out.println("MessageRepository is injected successfully.");
        }
    }
    // 用于存储每个用户的连接
    private Map<String, WebSocketSession> userSessions = new HashMap<>();



    //    @Override
//    public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
//        // 打印接收到的消息
//        System.out.println("接收到消息: " + message.getPayload());
//
//        // 可以选择将消息存储到数据库
//        storeMessageInDatabase("User", message.getPayload());
//
//        // 将消息广播给所有已连接的客户端
//        for (WebSocketSession s : WebSocketSessionManager.getSessions()) {
//            if (s.isOpen()) {
//                s.sendMessage(new TextMessage(message.getPayload()));
//            }
//        }
//    }
    //普通版
    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        try {
            System.out.println("接收到消息: " + message.getPayload());

            // 存储消息到数据库
            storeMessageInDatabase("User", message.getPayload());

            // 广播消息
            for (WebSocketSession s : WebSocketSessionManager.getSessions()) {
                if (s.isOpen()) {
                    s.sendMessage(new TextMessage(message.getPayload()));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();  // 打印出错误信息
            session.close(CloseStatus.SERVER_ERROR);  // 关闭连接并标记为服务器错误
        }
    }

//    @Override
//    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
//        // 从 URL 查询参数中获取用户名
//        String username = getUsernameFromSession(session);
//
//        // 保存到会话管理器中
//        WebSocketSessionManager.addSession(session);
//        userSessions.put(username, session); // 将用户名和会话存储在一起
//
//        System.out.println("新客户端连接: " + session.getId() + "，用户名: " + username);
//    }


    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        WebSocketSessionManager.addSession(session);
        System.out.println("新客户端连接: " + session.getId());
    }
//普通版
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        try {
            WebSocketSessionManager.removeSession(session); // 关闭连接时移除会话
            System.out.println("客户端断开连接: " + session.getId());
        } catch (Exception e) {
            e.printStackTrace(); // 可以记录异常，确保不会影响其他连接
        }
    }

//    private void storeMessageInDatabase(String sender, String message) {
//        // 这里可以将消息存储到数据库
//        // 实际应用中应该使用 JPA 或 JDBC 进行数据库操作
//    }



    private String getUsernameFromSession(WebSocketSession session) {
        // 获取 URL 中的用户名参数（假设客户端通过查询参数传递用户名）
        UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl(session.getUri().toString()).build();
        return uriComponents.getQueryParams().getFirst("username");
    }


    // 存储消息到数据库
    private void storeMessageInDatabase(String sender, String messageContent) {
        try {
            Message message = new Message();
            message.setSender(sender);
            message.setMessage(messageContent);
            messageRepository.save(message);  // 确保这里没有抛出异常
        } catch (Exception e) {
            e.printStackTrace();  // 打印出异常信息，方便调试
        }
    }

}
